home *** CD-ROM | disk | FTP | other *** search
- /*$T image_util.c GC 1.137 08/09/02 17:47:18 */
-
- /*$6
- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- */
-
- #include "zgl.h"
-
- /* image conversion */
- void gl_convertRGB_to_5R6G5B(unsigned short *pixmap, unsigned char *rgb, int xsize, int ysize) {
- int i, n;
- unsigned char *p;
- /*~~~~~~~~~~~~~~~~~*/
-
- p = rgb;
- n = xsize * ysize;
- for(i = 0; i < n; i++) {
- pixmap[i] = ((p[0] & 0xF8) << 8) | ((p[1] & 0xFC) << 3) | ((p[2] & 0xF8) >> 3);
- p += 3;
- }
- }
-
- /* */
- void gl_convertRGB_to_8A8R8G8B(unsigned int *pixmap, unsigned char *rgb, int xsize, int ysize) {
- int i, n;
- unsigned char *p;
-
- p = rgb;
- n = xsize * ysize;
- for(i = 0; i < n; i++) {
- pixmap[i] = (((unsigned int) p[0]) << 16) | (((unsigned int) p[1]) << 8) | (((unsigned int) p[2]));
- p += 3;
- }
- }
-
- /* linear interpolation with xf,yf normalized to 2^16 */
- #define INTERP_NORM_BITS 16
- #define INTERP_NORM (1 << INTERP_NORM_BITS)
-
- /* */
-
- static inline int interpolate(int v00, int v01, int v10, int xf, int yf) {
- return v00 + (((v01 - v00) * xf + (v10 - v00) * yf) >> INTERP_NORM_BITS);
- }
-
- /* TODO: more accurate resampling */
- void gl_resizeImage(unsigned char *dest, int xsize_dest, int ysize_dest, unsigned char *src,
- int xsize_src, int ysize_src) {
- unsigned char *pix, *pix_src;
- float x1, y1, x1inc, y1inc;
- int xi, yi, j, xf, yf, x, y;
-
- pix = dest;
- pix_src = src;
-
- x1inc = (float) (xsize_src - 1) / (float) (xsize_dest - 1);
- y1inc = (float) (ysize_src - 1) / (float) (ysize_dest - 1);
-
- y1 = 0;
- for(y = 0; y < ysize_dest; y++) {
- x1 = 0;
- for(x = 0; x < xsize_dest; x++) {
- xi = (int) x1;
- yi = (int) y1;
- xf = (int) ((x1 - floor(x1)) * INTERP_NORM);
- yf = (int) ((y1 - floor(y1)) * INTERP_NORM);
-
- if((xf + yf) <= INTERP_NORM) {
- for(j = 0; j < 3; j++) {
- pix[j] = interpolate(pix_src[(yi * xsize_src + xi) * 3 + j],
- pix_src[(yi * xsize_src + xi + 1) * 3 + j],
- pix_src[((yi + 1) * xsize_src + xi) * 3 + j],
- xf, yf);
- }
- }
- else {
- xf = INTERP_NORM - xf;
- yf = INTERP_NORM - yf;
- for(j = 0; j < 3; j++) {
- pix[j] = interpolate(pix_src[((yi + 1) * xsize_src + xi + 1) * 3 + j],
- pix_src[((yi + 1) * xsize_src + xi) * 3 + j],
- pix_src[(yi * xsize_src + xi + 1) * 3 + j],
- xf, yf);
- }
- }
-
- pix += 3;
- x1 += x1inc;
- }
-
- y1 += y1inc;
- }
- }
-
- #define FRAC_BITS 16
-
- /* resizing with no interlating nor nearest pixel */
- void gl_resizeImageNoInterpolate(unsigned char *dest, int xsize_dest, int ysize_dest,
- unsigned char *src, int xsize_src, int ysize_src) {
- unsigned char *pix, *pix_src, *pix1;
- int x1, y1, x1inc, y1inc;
- int xi, yi, x, y;
-
- pix = dest;
- pix_src = src;
-
- x1inc = (int) ((float) ((xsize_src) << FRAC_BITS) / (float) (xsize_dest));
- y1inc = (int) ((float) ((ysize_src) << FRAC_BITS) / (float) (ysize_dest));
-
- y1 = 0;
- for(y = 0; y < ysize_dest; y++) {
- x1 = 0;
- for(x = 0; x < xsize_dest; x++) {
- xi = x1 >> FRAC_BITS;
- yi = y1 >> FRAC_BITS;
- pix1 = pix_src + (yi * xsize_src + xi) * 3;
-
- pix[0] = pix1[0];
- pix[1] = pix1[1];
- pix[2] = pix1[2];
-
- pix += 3;
- x1 += x1inc;
- }
-
- y1 += y1inc;
- }
- }
-